package hello.webclient;

import hello.dto.Greeting;
import org.springframework.beans.factory.annotation.Value;
import reactor.core.publisher.Mono;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;

@Component
public class GreetingClient {

	/**
	 * 区别于 RestTemplate ，RestTemplate 是阻塞的、穿行化的
	 * 但是 reactive 中的 WebClient 是非阻塞的，其使用了响应式的特性
	 * 并且可以用于传统的 spring mvc 应用
	 * 也就是说：可以使用 webClient 来与 非响应式的、阻塞的服务来交互
	 */
	private final WebClient client;



	// Spring Boot auto-configures a `WebClient.Builder` instance with nice defaults and customizations.
	// We can use it to create a dedicated `WebClient` for our component.
	public GreetingClient(WebClient.Builder builder) {
		this.client = builder.baseUrl("http://localhost:8083").build();
	}


	public Mono<String> getMessage() {

		// 以 Mono 对象的形势持有消息，可以通过 getMessage() 来获取消息
		return this.client.get().uri("/hello").accept(MediaType.APPLICATION_JSON)
				.retrieve()
				.bodyToMono(Greeting.class)
				.map(Greeting::getMessage);
	}

}
